reactive.ts文件vue3中实现数据响应式的一个核心库。下面我将对它里面封装的一些方法进行解读。

# 1、toRaw

  该方法返回响应式对象原来的对象。在toRaw方法中获取observed["__v_raw"]属性触发observed对象的setter钩子函数,然后返回observed的被代理对象。

//本质上是一个递归函数,通过查找响应式对象上额"__v_raw"属性来返回目标对象
function toRaw(observed) {
    return ((observed && toRaw(observed["__v_raw" /* RAW */])) || observed);
}
//proxy中的getter钩子函数
function createGetter(isReadonly = false, shallow = false) {
    return function get(target, key, receiver) {
        if (key === "__v_isReactive" /* IS_REACTIVE */) {
            return !isReadonly;
        }
        else if (key === "__v_isReadonly" /* IS_READONLY */) {
            return isReadonly;
        }
        else if (key === "__v_raw" /* RAW */ &&
            receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) {
            return target;
        }
        ...
    };
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//demo
const target={
    name: "james",
    age: 23,
    arr: [1, 2, 3]
}
const state = reactive(target)
const foo=ref({
    name:"james"
})
console.log(toRaw(state)===target);//true
1
2
3
4
5
6
7
8
9
10
11
Last Updated: 6/17/2021, 12:14:30 AM